package com.cn.zpark.dao.impl;

import com.cn.zpark.dao.IUserDao;
import com.cn.zpark.pojo.User;
import com.cn.zpark.utils.DruidUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @PackageName: com.cn.zpark.dao.impl
 * @ClassName: UserDaoImpl
 * @Description:用户持久层接口实现类
 * @author: RZS
 * @date: 2022/4/29  10:03
 */
public class UserDaoImpl implements IUserDao {

    // 准备数据库连接信息
    private Connection conn = null;
    private PreparedStatement stat = null;
    private ResultSet res = null;

    /**
     * 用户注册
     * @param user 用户对象
     * @return 受影响的行数
     */
    @Override
    public Integer insertUser(User user) {
        // 定义变量，用于记录sql执行后的结果
        Integer row = 0;

        try {
            // 获取连接对象
            conn = DruidUtils.getConn();
            // 开启事务
            conn.setAutoCommit(false);
            // 创建sql
            String sql = "insert into user(username, uname, password, email, phone, sex, create_user_time) " +
                    "values(?, ?, ?, ?, ?, ?, ?)";
            // 创建预编译sql对象
            stat = conn.prepareStatement(sql);
            // 替换占位符
            stat.setString(1, user.getUsername());
            stat.setString(2, user.getUname());
            stat.setString(3, user.getPassword());
            stat.setString(4, user.getEmail());
            stat.setString(5, user.getPhone());
            stat.setString(6, user.getSex());
            stat.setString(7, user.getCreateUserTime());
            // 执行sql，并且获取结果, 修改row
            row = stat.executeUpdate();
            // 提交事务
            conn.commit();
        } catch(Exception e) {
            // 回滚事务
            try {
                conn.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            // 关闭资源
            DruidUtils.close(res, stat, conn);
        }
        // 返回受影响的行数
        return row;
    }

    /**
     * 用户登录接口（根据用户名查询用户数据）
     * @param username 用户名
     * @return 用户数据
     */
    @Override
    public User selectByUsername(String username) {
        // 定义user对象
        User user = null;

        try {
            // 获取数据库连接对象
            conn = DruidUtils.getConn();
            // 编写sql语句
            String sql = "select id, username, uname, password, email, phone, sex, is_delete, create_user_time, " +
                    "modify_pwd_time from user where username = ?";
            // 创建预编译对象
            stat = conn.prepareStatement(sql);
            // 替换占位符
            stat.setString(1, username);
            // 执行sql
            res = stat.executeQuery();
            // 将数据封装到user对象中
            while (res.next()) {
                // 创建user对象
                user = new User();
                // 封装数据
                user.setId(res.getInt("id"));
                user.setUsername(res.getString("username"));
                user.setUname(res.getString("uname"));
                user.setPassword(res.getString("password"));
                user.setEmail(res.getString("email"));
                user.setPhone(res.getString("phone"));
                user.setSex(res.getString("sex"));
                user.setIsDelete(res.getInt("is_delete"));
                user.setCreateUserTime(res.getString("create_user_time"));
                user.setModifyPwdTime(res.getString("modify_pwd_time"));
            }
        } catch(Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            DruidUtils.close(res, stat, conn);
        }
        // 返回user对象
        return user;
    }
}
